#include <stdio.h>
#include <stdint.h>
#include "matrix_button.h"
#include "gd32f4xx.h"
#include "systick.h"

void matrix_config()
{
    // 开启外设时钟,E组
    rcu_periph_clock_enable(GPIOE);
}

// 输出作为接地端,输入作为供电段
// 配置行为输出模式,列为输入模式
void row_out_col_in()
{
    // 配置Row,这是输出模式
    gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, ROW1);
    gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, ROW2);
    gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, ROW3);
    gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, ROW4);

    // 挽模式
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, ROW1);
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, ROW2);
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, ROW3);
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, ROW4);

    // 输出低电平:作为接地端,
    gpio_bit_reset(GPIOE, ROW1);
    gpio_bit_reset(GPIOE, ROW2);
    gpio_bit_reset(GPIOE, ROW3);
    gpio_bit_reset(GPIOE, ROW4);

    // 输入模式,上拉电阻,作为供电端,默认输入为1
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, COL1);
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, COL2);
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, COL3);
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, COL4);
}

void row_in_col_out()
{
    // 配置Col,这是输出模式
    gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, COL1);
    gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, COL2);
    gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, COL3);
    gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, COL4);

    // 挽模式
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, COL1);
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, COL2);
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, COL3);
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, COL4);

    // 输出低电平:作为接地端,
    gpio_bit_reset(GPIOE, COL1);
    gpio_bit_reset(GPIOE, COL2);
    gpio_bit_reset(GPIOE, COL3);
    gpio_bit_reset(GPIOE, COL4);

    // 输入模式,上拉电阻,作为供电端,默认输入为1
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, ROW1);
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, ROW2);
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, ROW3);
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, ROW4);
}

int colIndex;
int rowIndex;
void matrix_run()
{

    row_out_col_in();

    printf("cols = %d,%d,%d,%d\n", gpio_input_bit_get(GPIOE, COL1), gpio_input_bit_get(GPIOE, COL2), gpio_input_bit_get(GPIOE, COL3), gpio_input_bit_get(GPIOE, COL4));
    
    if (gpio_input_bit_get(GPIOE, COL1) == 0)
    {
        colIndex = 1;
    }
    else if (gpio_input_bit_get(GPIOE, COL2) == 0)
    {
        colIndex = 2;
    }
    else if (gpio_input_bit_get(GPIOE, COL3) == 0)
    {
        colIndex = 3;
    }
    else if (gpio_input_bit_get(GPIOE, COL4) == 0)
    {
        colIndex = 4;
    }
    else
    {
        colIndex = 0;
    }

    row_in_col_out();
    if (gpio_input_bit_get(GPIOE, ROW1) == 0)
    {
        rowIndex = 1;
    }
    else if (gpio_input_bit_get(GPIOE, ROW2) == 0)
    {
        rowIndex = 2;
    }
    else if (gpio_input_bit_get(GPIOE, ROW3) == 0)
    {
        rowIndex = 3;
    }
    else if (gpio_input_bit_get(GPIOE, ROW4) == 0)
    {
        rowIndex = 4;
    }
    else
    {
        rowIndex = 0;
    }

    printf("rowIndex=%d,colIndex=%d\n", rowIndex, colIndex);
    delay_1ms(1000);
}
